#!/bin/bash
set -e  # 脚本遇到错误立即退出（确保构建过程不忽略错误）
set -u  # 引用未定义变量时报错（避免拼写错误导致的隐患）

# ===================== 配置参数 =====================
# 源码目录（Jake 工具的 Java 源码存放路径）
SRC_DIR="src"
# 编译输出目录（临时存放 .class 文件）
CLASS_DIR="classes"
# 最终生成的 JAR 文件名
JAR_NAME="Jake.jar"
# 入口类全限定名（Jake 工具的入口是 Jake.java）
MAIN_CLASS="Jake"
# 编码格式（避免中文注释编译乱码）
ENCODING="UTF-8"

# ===================== 步骤 1：检查依赖环境 =====================
echo "=== 1/5 检查构建环境 ==="
# 检查 JDK 是否安装（需 javac 和 jar 命令）
if ! command -v javac &> /dev/null; then
    echo "❌ 错误：未找到 javac 命令，请先安装 JDK 并配置环境变量"
    exit 1
fi

if ! command -v jar &> /dev/null; then
    echo "❌ 错误：未找到 jar 命令，请先安装 JDK 并配置环境变量"
    exit 1
fi

# 检查源码目录是否存在
if [ ! -d "$SRC_DIR" ]; then
    echo "❌ 错误：源码目录 $SRC_DIR 不存在，请确认路径正确"
    exit 1
fi

# 检查源码目录是否有 Java 文件
JAVA_FILES=$(find "$SRC_DIR" -name "*.java")
if [ -z "$JAVA_FILES" ]; then
    echo "❌ 错误：源码目录 $SRC_DIR 下未找到 .java 文件"
    exit 1
fi

echo "✅ 环境检查通过（JDK 已安装，源码目录有效）"

# ===================== 步骤 2：清理旧构建产物 =====================
echo -e "\n=== 2/5 清理旧构建产物 ==="
# 删除旧的编译目录和 JAR 文件（避免旧文件干扰）
if [ -d "$CLASS_DIR" ]; then
    echo "正在删除旧编译目录：$CLASS_DIR"
    rm -rf "$CLASS_DIR"
fi

if [ -f "$JAR_NAME" ]; then
    echo "正在删除旧 JAR 文件：$JAR_NAME"
    rm -f "$JAR_NAME"
fi

echo "✅ 旧产物清理完成"

# ===================== 步骤 3：创建编译目录 =====================
echo -e "\n=== 3/5 创建编译目录 ==="
mkdir -p "$CLASS_DIR"
if [ ! -d "$CLASS_DIR" ]; then
    echo "❌ 错误：创建编译目录 $CLASS_DIR 失败"
    exit 1
fi

echo "✅ 编译目录 $CLASS_DIR 创建成功"

# ===================== 步骤 4：编译 Java 源码 =====================
echo -e "\n=== 4/5 编译 Java 源码 ==="
# 编译命令说明：
# -encoding $ENCODING：指定源码编码（避免中文乱码）
# -d $CLASS_DIR：指定编译输出目录
# -sourcepath $SRC_DIR：指定源码根目录（让编译器找到包结构）
# $(find ...)：查找所有 .java 文件（递归处理子目录）
javac -encoding "$ENCODING" \
      -d "$CLASS_DIR" \
      -sourcepath "$SRC_DIR" \
      $(find "$SRC_DIR" -name "*.java")

# 检查编译是否生成了入口类的 .class 文件（验证编译成功）
MAIN_CLASS_FILE="$CLASS_DIR/$MAIN_CLASS.class"
if [ ! -f "$MAIN_CLASS_FILE" ]; then
    echo "❌ 错误：编译失败，未生成入口类文件 $MAIN_CLASS_FILE"
    exit 1
fi

echo "✅ 源码编译完成（共 $(find "$CLASS_DIR" -name "*.class" | wc -l) 个 .class 文件）"

# ===================== 步骤 5：打包成可执行 JAR =====================
echo -e "\n=== 5/5 打包生成 $JAR_NAME ==="
# 1. 创建 MANIFEST.MF 清单文件（指定入口类，确保 java -jar 可运行）
MANIFEST_FILE="MANIFEST.MF"
cat > "$MANIFEST_FILE" << EOF
Manifest-Version: 0.0.1
Main-Class: $MAIN_CLASS
Created-By: build-jake.sh
EOF

# 2. 打包 JAR（-C 切换到编译目录，避免 class 文件包含 $CLASS_DIR 路径）
jar cfm "$JAR_NAME" "$MANIFEST_FILE" -C "$CLASS_DIR" .

# 3. 检查 JAR 文件是否生成成功
if [ ! -f "$JAR_NAME" ]; then
    echo "❌ 错误：JAR 打包失败，未生成 $JAR_NAME"
    exit 1
fi

# ===================== 步骤 6：清理临时文件 =====================
echo -e "\n=== 清理临时文件 ==="
rm -rf "$CLASS_DIR"  # 删除编译临时目录
rm -f "$MANIFEST_FILE"  # 删除临时清单文件
echo "✅ 临时文件清理完成"

# ===================== 构建成功提示 =====================
echo -e "\n=================================================="
echo "🎉 Jake 工具构建成功！"
echo "生成文件：$(pwd)/$JAR_NAME"
echo "使用方式：java -jar $JAR_NAME [目标名]（如 java -jar $JAR_NAME fatjar）"
echo "=================================================="

cp Jake.jar ../examples/json-parser-demo
cp Jake.jar ../examples/spring-boot-demo